package aspectjutil.eventmanager;

import java.lang.reflect.Modifier;
import java.util.Comparator;

public class SubscriberMethodUnitComparator implements Comparator<SubscriberMethodUnit> {

	@Override
	public int compare( SubscriberMethodUnit unit1, SubscriberMethodUnit unit2) {
		if ( unit1.turn < unit2.turn) return -1;
		if ( unit1.turn > unit2.turn) return 1;
		
		int unit1Modifier = unit1.getMethod().getModifiers();
		int unit2Modifier = unit2.getMethod().getModifiers();
		
		if ( Modifier.isStatic( unit1Modifier) && !Modifier.isStatic( unit2Modifier)) return -1;
		if ( !Modifier.isStatic( unit1Modifier) && Modifier.isStatic( unit2Modifier)) return 1;
		if ( Modifier.isPublic( unit1Modifier) && !Modifier.isPublic( unit2Modifier)) return -1;
		if ( !Modifier.isPublic( unit1Modifier) && Modifier.isPublic( unit2Modifier)) return 1;
		if ( Modifier.isPublic( unit1Modifier) && Modifier.isPublic( unit2Modifier)) return 0;
		if ( Modifier.isProtected( unit1Modifier) && !Modifier.isProtected( unit2Modifier)) 
			return -1;
		if ( !Modifier.isProtected( unit1Modifier) && Modifier.isProtected( unit2Modifier)) 
			return 1;
		if ( Modifier.isProtected( unit1Modifier) && Modifier.isProtected( unit2Modifier)) 
			return 0;
		return 0;
	}
}
